From a81d0ee933c35323f32269dad37977934b6cbb28 Mon Sep 17 00:00:00 2001 From: Kevin Tian Date: Wed, 31 Aug 2011 15:18:23 +0100 Subject: [PATCH] x86: add irq count for IPIs such count is useful to assist decision make in cpuidle governor, while w/o this patch only device interrupts through do_IRQ is currently counted. Signed-off-by: Kevin Tian --- xen/arch/x86/apic.c | 4 ++++ xen/arch/x86/cpu/mcheck/mce_intel.c | 2 ++ xen/arch/x86/io_apic.c | 1 + xen/arch/x86/smp.c | 3 +++ 4 files changed, 10 insertions(+) diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index 3d4d5ccc5f..6a75036a09 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -1332,6 +1332,7 @@ fastcall void smp_apic_timer_interrupt(struct cpu_user_regs * regs) struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); perfc_incr(apic_timer); + this_cpu(irq_count)++; raise_softirq(TIMER_SOFTIRQ); set_irq_regs(old_regs); } @@ -1353,6 +1354,7 @@ fastcall void smp_spurious_interrupt(struct cpu_user_regs *regs) unsigned long v; struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); /* @@ -1388,6 +1390,7 @@ fastcall void smp_error_interrupt(struct cpu_user_regs *regs) unsigned long v, v1; struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); /* First tickle the hardware, only then report what went on. -- REW */ v = apic_read(APIC_ESR); @@ -1419,6 +1422,7 @@ fastcall void smp_pmu_apic_interrupt(struct cpu_user_regs *regs) { struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; hvm_do_pmu_interrupt(regs); set_irq_regs(old_regs); } diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index d6d4bb99ab..bf75f6714c 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -77,6 +77,7 @@ static void (*__read_mostly vendor_thermal_interrupt)(struct cpu_user_regs *regs fastcall void smp_thermal_interrupt(struct cpu_user_regs *regs) { struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); vendor_thermal_interrupt(regs); irq_exit(); @@ -1147,6 +1148,7 @@ fastcall void smp_cmci_interrupt(struct cpu_user_regs *regs) struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; irq_enter(); mctc = mcheck_mca_logout( diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index dd45ff414e..471f7530e4 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -441,6 +441,7 @@ fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs) struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; irq_enter(); me = smp_processor_id(); diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c index 2f527079cd..3edebf3df1 100644 --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -221,6 +221,7 @@ fastcall void smp_invalidate_interrupt(void) { ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; irq_enter(); if ( !__sync_local_execstate() || (flush_flags & (FLUSH_TLB_GLOBAL | FLUSH_CACHE)) ) @@ -385,6 +386,7 @@ fastcall void smp_event_check_interrupt(struct cpu_user_regs *regs) struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; set_irq_regs(old_regs); } @@ -421,6 +423,7 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs) ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; __smp_call_function_interrupt(); set_irq_regs(old_regs); } -- 2.30.2